-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
[generator] Add managedOverride
values none
and reabstract
.
#1000
Conversation
This change may be incomplete. Use-case: reabstract interface members: diff --git a/src/Java.Base/Java.Base.csproj b/src/Java.Base/Java.Base.csproj
index b05f70d6..7980c93f 100644
--- a/src/Java.Base/Java.Base.csproj
+++ b/src/Java.Base/Java.Base.csproj
@@ -4,8 +4,7 @@
<TargetFrameworks>$(DotNetTargetFramework)</TargetFrameworks>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
- <!-- TODO: CS0108 is due to e.g. interfaces re-abstracting default interface methods -->
- <NoWarn>$(NoWarn);8764;CS0108</NoWarn>
+ <NoWarn>$(NoWarn);8764</NoWarn>
<Version>$(JICoreLibVersion)</Version>
</PropertyGroup>
diff --git a/src/Java.Base/Transforms/Metadata.xml b/src/Java.Base/Transforms/Metadata.xml
index 21828b34..0dffb755 100644
--- a/src/Java.Base/Transforms/Metadata.xml
+++ b/src/Java.Base/Transforms/Metadata.xml
@@ -12,6 +12,15 @@
<!-- warning CS0672: Member 'Enum.JavaFinalize()' overrides obsolete member 'Object.JavaFinalize()'. Add the Obsolete attribute to 'Enum.JavaFinalize()'. -->
<attr path="/api/package[@name='java.lang']/class[@name='Enum']/method[@name='finalize' and count(parameter)=0]" name="deprecated">deprecated</attr>
+ <!-- warning CS0108: 'MEMBER' hides inherited member 'MEMBER'. Use the new keyword if hiding was intended. -->
+ <attr path="/api/package[@name='java.lang.reflect']/interface[
+ @name='AnnotatedParameterizedType'
+ or @name='AnnotatedArrayType'
+ or @name='AnnotatedTypeVariable'
+ or @name='AnnotatedWildcardType'
+ ]/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"
+ name="managedOverride">reabstract</attr>
+
<!-- AbstractStringBuilder is package-private; fixity fix -->
<remove-node path="//api/package[@name='java.lang']/class[@name='AbstractStringBuilder']" />
After building, we still get CS0108 warnings:
"Offending" code: public partial interface IAnnotatedArrayType : global::Java.Lang.Reflect.IAnnotatedType {
// Currently generated
abstract global::Java.Lang.Reflect.IAnnotatedType? AnnotatedOwnerType {
// Metadata.xml XPath method reference: path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedArrayType']/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"
[global::Java.Interop.JniMethodSignature ("getAnnotatedOwnerType", "()Ljava/lang/reflect/AnnotatedType;")]
get;
}
} We have the public partial interface IAnnotatedArrayType : global::Java.Lang.Reflect.IAnnotatedType {
// Needs to generated
abstract global::Java.Lang.Reflect.IAnnotatedType? IAnnotatedType.AnnotatedOwnerType {
// Metadata.xml XPath method reference: path="/api/package[@name='java.lang.reflect']/interface[@name='AnnotatedArrayType']/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"
[global::Java.Interop.JniMethodSignature ("getAnnotatedOwnerType", "()Ljava/lang/reflect/AnnotatedType;")]
get;
}
} I can "make the needed output happen" by adding an additional <attr path="/api/package[@name='java.lang.reflect']/interface[
@name='AnnotatedParameterizedType'
or @name='AnnotatedArrayType'
or @name='AnnotatedTypeVariable'
or @name='AnnotatedWildcardType'
]/method[@name='getAnnotatedOwnerType' and count(parameter)=0]"
name="propertyName">IAnnotatedType.AnnotatedOwnerType</attr> The question is whether we want to require two steps for this scenario -- set An added complication is that while I can workaround properties as above, I can't figure out how to work around method names:
Thus, I want to emit <attr path="/api/package[@name='java.io']/interface[
@name='Closeable'
]/method[@name='close' and count(parameter)=0]"
name="managedOverride">reabstract</attr> but then I need an explicitly qualified <attr path="/api/package[@name='java.io']/interface[
@name='Closeable'
]/method[@name='close' and count(parameter)=0]"
name="managedName">IAutoCloseable.Close</attr> Then the public partial interface ICloseable : global::Java.Lang.IAutoCloseable {
abstract void IAutoCloseable_Close ();
} Given that I can't fixup method names in this manner, I think that when |
I'm not sure this is something we can do in an automated manner. I don't think we currently attempt to track what members implement which interface contracts. Also, I'm not sure we can do that. For example, does this reabstract interface I1
{
void DoThing () { }
}
interface I2
{
void DoThing () { }
}
interface I3 : I1, I2
{
abstract void DoThing ();
} I'm also not sure using Perhaps we need an additional <attr path="/api/package[@name='java.io']/interface[@name='Closeable']/method[@name='close']" name="explicitInterface">
IAutoCloseable
</attr> |
It might not have worked, actually. Remember that for my use case of Java.Base bindings, "marshal methods" are not emitted (bc5bcf4):
Commit 4787e01 implemented marshal methods for Java.Base by using the Java.Interop.Export infrastructure; Thus, Java.Base wouldn't currently hit a scenario where "
That sounds like a good idea to me. |
Given that we will need separate I think the answer is No. |
Fixes #981
Add support for the
managedOverride = none
value:This value ensures that the member is not marked as
virtual
oroverride
, useful forsealed
classes.Additionally add support for the
managedOverride = reabstract
value:This only affects interfaces, and allows an interface member to be "reabstracted":